/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sistemasdistribuidos.cliente;

import java.io.*;
import java.net.*;
import java.util.Random;

public class Cliente extends Thread {

    private Socket socketCliente;
    private ObjectOutputStream saida;
    private ObjectInputStream entrada;
    private int[] vetor;
    private String nome = "";

    public Cliente(String nome) {
        this.nome = nome;
    }

    @Override
    public void run() {
        criarVetor();
        try {
            //Cria o socket para se comunicar com o servidor.
            socketCliente = new Socket("localhost", 2004);
            System.out.println(this.nome + "> conectado ao servidor (porta 2004).");

            //Obtém os fluxos de entrada e saída.
            saida = new ObjectOutputStream(socketCliente.getOutputStream());
            saida.flush();
            entrada = new ObjectInputStream(socketCliente.getInputStream());

            //Envia o vetor
            System.out.println(this.nome + "> array Normal:" + printArray(this.vetor));
            enviarMensagem(this.vetor);

            Object obj;
            //Fica esperando o servidor retornar a resposta.
            do {
                obj = entrada.readObject();
                if (!(obj instanceof String)) {
                    //Recebeu o array ordenado.
                    int[] arr = (int[]) obj;
                    System.out.println(this.nome + "> array ordenado: " + printArray(arr));
                }
                obj = null;
            } while (obj != null);

        } catch (IOException | ClassNotFoundException ex) {
            System.err.println("Erro: " + ex);
        } finally {
            //Fecha todas as conexões.
            try {
                entrada.close();
                saida.close();
                socketCliente.close();
                System.out.println(this.nome + "> conexão encerrada.");
            } catch (IOException ex) {
                System.err.println("Erro: " + ex);
            }
        }
    }

    /**
     * Envia uma mensagem para o servidor.
     *
     * @param msg Objeto a ser enviado.
     */
    void enviarMensagem(Object msg) {
        try {
            saida.writeObject(msg);
            saida.flush();
        } catch (IOException ex) {
            System.err.println("Erro ao enviar mensagem: " + ex);
        }
    }

    public void criarVetor() {
        Random r = new Random();
        this.vetor = new int[10];
        for (int i = 0; i < this.vetor.length; i++) {
            this.vetor[i] = r.nextInt(101); //Sorteia valores de 0 a 100.
        }
    }

    /**
     * Gera uma representação em String de um array no formato: número número
     * número ... número
     *
     * @param arr Array com os valores.
     * @return String com os valores de arr.
     */
    private String printArray(int[] arr) {
        String s = "";
        for (int i = 0; i < arr.length; i++) {
            s += arr[i] + " ";
        }
        return s.trim();
    }

    public static void main(String args[]) {
        Cliente c1 = new Cliente("Cliente 1");
        c1.start();
        Cliente c2 = new Cliente("Cliente 2");
        c2.start();
        Cliente c3 = new Cliente("Cliente 3");
        c3.start();
        Cliente c4 = new Cliente("Cliente 4");
        c4.start();
        Cliente c5 = new Cliente("Cliente 5");
        c5.start();
    }
}